package com.heima.user.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cjq.jwt.JwtUtil;
import com.heima.common.constant.JwtConstant;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private JwtUtil jwtUtil;
    /**
     * 用户登录认证处理
     *
     * 实现用户登录逻辑，支持两种模式：
     * 1. 匿名登录：当手机号和密码均为空时，生成访客token
     * 2. 凭证登录：验证手机号、密码匹配后生成用户token
     *
     * @param loginDto 登录数据传输对象，包含手机号和密码
     * @return ResponseResult 统一响应结果，包含：
     *         - 成功时：token及用户信息（敏感字段已清除）
     *         - 失败时：对应错误码及提示信息
     */
    @Override
    public ResponseResult login(LoginDto loginDto) {
        String password = loginDto.getPassword();
        String phone = loginDto.getPhone();

        // 匿名访客登录处理（双空检测）
        if (StringUtils.isEmpty(password) && StringUtils.isEmpty(phone)) {
            HashMap<String, Object> claims = new HashMap<>();
            // 生成0L标识的访客令牌
            String jtl = UUID.randomUUID().toString().replace("-", "");
            claims.put("token",AppJwtUtil.getToken(jtl,0L));
            return ResponseResult.okResult(claims);
        }

        // 根据手机号查询用户数据
        ApUser dbUser = query().eq("phone", phone).one();
        if (dbUser == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST,"用户数据不存在");
        }

        // 密码验证流程
        String salt = dbUser.getSalt();
        // 使用相同盐值加密用户输入
        String verifyPassword = DigestUtils.md5DigestAsHex((password+salt).getBytes());
        // 比对数据库加密密码
        if (!verifyPassword.equals(dbUser.getPassword())){
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        String jtl = UUID.randomUUID().toString().replace("-", "");

        // 构建返回结果
        HashMap<String, Object> claims = new HashMap<>();

        claims.put("id",dbUser.getId().longValue());
        String token = jwtUtil.generateToken(jtl, claims, SignatureAlgorithm.HS256, CompressionCodecs.GZIP);
        claims.clear();
        claims.put("token",token);
        // 清除敏感信息
        dbUser.setSalt("");
        dbUser.setPassword("");
        claims.put("user",dbUser);

        // 将用户ID和jwtId的映射存入Redis
        redisTemplate.opsForValue().set(
                JwtConstant.APP_JWT_TOKEN_KEY +jtl,
                dbUser.getId().toString(),
                JwtConstant.APP_EXPIRE_TIME,
                TimeUnit.SECONDS);
        return ResponseResult.okResult(claims);
    }
}
